Docker 日志过大排查

使用 df -h 查看磁盘大小时,发现 docker /var/lib/docker/overlay2 目录将空间占满了。

切换到 /var/lib/docker 后发现 containers 目录很大,进一步使用 du -sh * 排查,发现是容器 json.log 文件过大造成。执行 cat /dev/null > *-json.log 将日志清空即可。

可以使用以下命令,查看所有容器日志的大小:

1
for d in $(ls -d /var/lib/docker/containers/*); do ls --time-style=long-iso -lh $d/*-json.log | awk -F' *|/' '{printf("%30s\t%s\t%s %s\t%s\n", "'$(docker ps -af id=${d##*/} --format "table {{.Names}}" | tail -1)'", $5, $6, $7, $14) }'; done

上面方案属于临时方案,若是使用 docker-compose 则还可以进行如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
redis:
image: redis:5.0
restart: always
container_name: IP20-redis-6378
environment:
- TZ=Asia/Shanghai
ports:
- 6378:6378
volumes:
- ./redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
logging: # 对日志大小进行设置
driver: "json-file"
options:
max-size: "5g"

或者直接关闭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'
services:
redis:
image: redis:5.0
restart: always
container_name: IP20-redis-6378
environment:
- TZ=Asia/Shanghai
ports:
- 6378:6378
volumes:
- ./redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
logging:
driver: "none"

若是没有使用 docker-compose,则在 docker run 的时候可以添加 -log-driver=none 参数来达到同样的效果。

亦或者修改 /etc/docker/daemon.json 文件,使其全局生效,而不是对单独的项目进行设置。

1
2
3
4
5
6
7
8
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"log-driver": "json-file",
"log-opts": {
"max-size": "1m",
"max-file": "1"
}
}

之后重启 docker 服务即可。不过为了灵活起见还是单独项目设置比较好。

参考:https://ld246.com/article/1576138670804